package com.vcc.core.util;


import com.alibaba.fastjson2.TypeReference;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


@Slf4j
public class RegexUtil {

    /**
     * 校验文件名字是否为xls结尾
     * @param name  文件的完整名称
     * @return 验证成功返回true，验证失败返回false
     */
    public static Boolean checkFileNameXls(String name ) {
        String regex = "^.+\\.(?i)(xls)$";
        return Pattern.matches(regex, name);
    }

    /**
     * 校验文件名字是否为xlsx结尾
     * @param name  文件的完整名称
     * @return 验证成功返回true，验证失败返回false
     */
    public static Boolean checkFileNameXlsx(String name ) {
        String regex = "^.+\\.(?i)(xlsx)$";
        return Pattern.matches(regex, name);
    }

    /**
     * <p>Checks if a String is whitespace, empty ("") or null.</p>
     * <pre>
     * RegexUtil.checkObjectIsNull(null)      = true
     * RegexUtil.checkObjectIsNull("")        = true
     * RegexUtil.checkObjectIsNull(" ")       = true
     * RegexUtil.checkObjectIsNull("bob")     = false
     * RegexUtil.checkObjectIsNull("  bob  ") = false
     * RegexUtil.checkObjectIsNull(1)         = false
     * RegexUtil.checkObjectIsNull(false)     = false
     * </pre>
     */
    public static boolean checkObjectIsNull(Object data) {
        if (data instanceof String) {
            return checkStringIsNull((String) data);
        } else if (data instanceof Map) {
            Map<Object, Object> map = JsonUtil.jsonStringToObject(data, new TypeReference<Map<Object, Object>>() {
            });
            return map == null || map.isEmpty();
        } else if (data instanceof List) {
            List<Object> list = JsonUtil.jsonStringToObject(data, new TypeReference<List<Object>>() {
            });
            return list == null || list.isEmpty();
        } else if (data instanceof Set) {
            Set<Object> set = JsonUtil.jsonStringToObject(data, new TypeReference<Set<Object>>() {
            });
            return set == null || set.isEmpty();
        }
        return data == null;
    }

    /**
     * <p>Checks if a String is whitespace, empty ("") or null.</p>
     * <pre>
     * RegexUtil.checkStringIsNull(null)      = true
     * RegexUtil.checkStringIsNull("")        = true
     * RegexUtil.checkStringIsNull(" ")       = true
     * RegexUtil.checkStringIsNull("bob")     = false
     * RegexUtil.checkStringIsNull("  bob  ") = false
     * </pre>
     */
    public static boolean checkStringIsNull(String data) {
        return StringUtils.isBlank(data);
    }

    /**
     * <p>Checks if a String is not empty (""), not null and not whitespace only.</p>
     * <pre>
     * RegexUtil.checkObjectIsNotNull(null)      = false
     * RegexUtil.checkObjectIsNotNull("")        = false
     * RegexUtil.checkObjectIsNotNull(" ")       = false
     * RegexUtil.checkObjectIsNotNull(1)         = true
     * RegexUtil.checkObjectIsNotNull(false)     = true
     * </pre>
     */
    public static boolean checkObjectIsNotNull(Object data) {
        if (data instanceof String) {
            return checkStringIsNotNull((String) data);
        } else if (data instanceof Map) {
            Map<Object, Object> map = JsonUtil.jsonStringToObject(data, new TypeReference<Map<Object, Object>>() {
            });
            return map != null && map.size() != 0;
        } else if (data instanceof List) {
            List<Object> list = JsonUtil.jsonStringToObject(data, new TypeReference<List<Object>>() {
            });
            return list != null && list.size() != 0;
        } else if (data instanceof Set) {
            Set<Object> set = JsonUtil.jsonStringToObject(data, new TypeReference<Set<Object>>() {
            });
            return set != null && set.size() != 0;
        }
        return data != null;
    }

    /**
     * <p>Checks if a String is not empty (""), not null and not whitespace only.</p>
     * <pre>
     * RegexUtil.checkStringIsNotNull(null)      = false
     * RegexUtil.checkStringIsNotNull("")        = false
     * RegexUtil.checkStringIsNotNull(" ")       = false
     * RegexUtil.checkStringIsNotNull("bob")     = true
     * RegexUtil.checkStringIsNotNull("  bob  ") = true
     * </pre>
     */
    public static boolean checkStringIsNotNull(String data) {
        return !StringUtils.isBlank(data);
    }


    /**
     * 验证手机号码（支持国际格式，+86135xxxx...（中国内地），+00852137xxxx...（中国香港））
     * @param mobile 移动、联通、电信运营商的号码段
     *
     * 移动的号段：134(0-8)、135、136、137、138、139、147（预计用于TD上网卡）
     * 、150、151、152、157（TD专用）、158、159、187（未启用）、188（TD专用）
     *
     * 联通的号段：130、131、132、155、156（世界风专用）、185（未启用）、186（3g）
     *
     * 电信的号段：133、153、180（未启用）、189,19
     * @return 验证成功返回true，验证失败返回false
     */
    public static Boolean checkMobile(String mobile) {
        String regex = "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(16[5,6])|(17[0-8])|(18[0-9])|(19[1、5、8、9]))\\d{8}$";
        return Pattern.matches(regex,mobile);
    }

    /**
     * 验证Email
     * @param email email地址，格式：zhangsan@zuidaima.com，zhangsan@xxx.com.cn，xxx代表邮件服务商
     * @return 验证成功返回true，验证失败返回false
     */
    public static Boolean checkEmail(String email) {
        String regex = "\\w+@\\w+\\.[a-z]+(\\.[a-z]+)?";
        return Pattern.matches(regex, email);
    }
}